#include <iostream>
#include <string>
#include <signal.h>
#include "../common/httplib.h"
#include "oj_control.hpp"

using namespace httplib;
using namespace ns_control;

static Control* _ctl = nullptr;
void AllOnline(int sig)
{
    _ctl->AllOnLineMachine();
}

// 在全局作用域添加辅助函数
std::string extract_session_id(const std::string& cookie_str) {
    std::string session_id;
    size_t pos = cookie_str.find("session_id=");
    if (pos != std::string::npos) {
        pos += 11; // "session_id=" 长度
        size_t end = cookie_str.find(';', pos);
        if (end == std::string::npos) end = cookie_str.size();
        session_id = cookie_str.substr(pos, end - pos);
    }
    return session_id;
}


// 用户路由
int main()
{
    Server svr;  // 服务器对象
    Control ctl;  // 逻辑控制对象

    _ctl = &ctl;
    signal(3, AllOnline);  // 捕捉三号信号 ctrl \ 可以重新上线操作

    // 1.用户获取题目列表数据
    svr.Get("/all_questions", [&ctl](const Request& req, Response& resp){
        std::string html;
        ctl.AllQuestions(html);
        resp.set_content(html, "text/html;charset=utf8");
    });

    // 2.用户获取单题题目内容
    svr.Get(R"(/question/(\d+))", [&ctl](const Request& req, Response& resp){  // (\\d+是正则表达式)
        std::string number = req.matches[1];  // 1对应的就是获取正则表达式中的内容
        std::string html;
        ctl.OneQuestion(number, html);
        resp.set_content(html, "text/html;charset=utf8");
    });

    // 3.用户获取单体解析结果
    svr.Post(R"(/judge/(\d+))", [&ctl](const Request& req, Response& resp){
        std::string number = req.matches[1];  // 1对应的就是获取正则表达式中的内容
        std::string out_json;
        ctl.Judge(number, req.body, out_json);
        resp.set_content(out_json, "application/json;charset=utf8");
    });

    // 扩展1：用户管理系统
    svr.Post("/user", [&ctl](const Request& req, Response& resp){
        std::string out_json;
        ctl.user_control(req.body, out_json, resp);
        resp.set_content(out_json, "application/json;charset=utf8");
    });



    // 新增路由：检查用户权限
    svr.Get("/check_root", [&ctl](const Request& req, Response& resp) {
        std::string session_id = extract_session_id(req.get_header_value("Cookie"));
        bool is_root = ctl.CheckUserIsRoot(session_id);
        Json::Value res;
        res["is_root"] = is_root;
        resp.set_content(Json::FastWriter().write(res), "application/json");
    });
// 管理员页面路由
    svr.Get("/admin", [&ctl](const Request& req, Response& resp) {
        auto cookies = req.get_header_value("Cookie");
        std::string session_id = extract_session_id(cookies);
        if (!ctl.CheckUserIsRoot(session_id)) {
            resp.set_redirect("/all_questions");
            return;
        }
        std::string html;
        ctl.AdminPage(html);
        resp.set_content(html, "text/html;charset=utf8");
    });

// 添加题目路由
    svr.Post("/admin/add_question", [&ctl](const Request& req, Response& resp) {
        // ... 权限验证（同上）
        std::string out_json;
        ctl.AddQuestion(req.body, out_json);
        resp.set_content(out_json, "application/json");
    });




    // 设置根目录
    svr.set_base_dir("./wwwroot");
    // 监听全体网卡，端口号固定8080
    svr.listen("0.0.0.0", 8080);
    return 0;
}
